package main

import (
	"fmt"
	"mmo_game_zinx/apis"
	"mmo_game_zinx/core"
	"zinx/ziface"
	"zinx/znet"
)

// 当前客户端建立链接后的hook函数
func OnConnectionAdd(conn ziface.IConnection) {
	// 创建一个Player对象
	player := core.NewPlayer(conn)
	// 给客户端发送MsgId:1的消息
	player.SyncPid()
	// 给客户端发送MsgId:200的消息
	player.BroadCastStartPosition()

	// 将当前新上线的玩家添加到WorldManager
	core.WorldMgrObj.AddPlayer(player)

	// 将该链接绑定到一个Pid, 玩家的id的属性
	conn.SetProperty("pid", player.Pid)

	// 同步周边玩家，告知他们当前玩家已经上线了，广播当前玩家的位置信息
	player.SyncSurrounding()

	fmt.Println("====> Player pid =", player.Pid, "is arrived <====")

}

// 当前客户端链接断开之前触发的hook钩子函数
func OnConnectionLost(conn ziface.IConnection) {
	// 得到当前的下线的玩家
	pid, err := conn.GetProperty("pid")
	if err != nil {
		fmt.Println("can't get lost player pid, err:", err)
		return
	}
	player := core.WorldMgrObj.GetPlayerByPid(pid.(int32))
	// 触发玩家下线的业务
	player.Offline()
	fmt.Println("====> player pid=", pid, " offline")

}

func main() {
	// 创建zinx server句柄
	s := znet.NewServer("MMO Game Zinx")

	// 链接创建和销毁的hook钩子函数
	s.SetOnConnStart(OnConnectionAdd)
	s.SetOnConnStop(OnConnectionLost)
	// 注册一些路由
	// 玩家聊消息广播的路由
	s.AddRouter(2, &apis.WorldChat{})
	// 玩家移动信息广播的路由
	s.AddRouter(3, &apis.MoveApi{})
	// 启动服务
	s.Serve()
}
